/**
 * 
 */
package co.edu.udistrital.erpgrid.trabajos.servicio;

import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.edu.udistrital.erpgrid.bd.modelo.connection.api.ICrud;
import co.edu.udistrital.erpgrid.bd.modelo.connection.api.IFinder;
import co.edu.udistrital.erpgrid.bd.modelo.pojo.Estado;
import co.edu.udistrital.erpgrid.bd.modelo.pojo.GridNodo;
import co.edu.udistrital.erpgrid.exceptions.CrudException;
import co.edu.udistrital.erpgrid.exceptions.FinderException;
import co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio;

// TODO: Auto-generated Javadoc
/**
 * La Clase TrabajosServicioImpl. Implementación de los servicios para los trabajos de los nodos.
 */
@Service
public class TrabajosServicioImpl implements ITrabajosServicio {

	/**
	 * El crud impl.
	 * @uml.property  name="crudImpl"
	 * @uml.associationEnd  readOnly="true"
	 */
	@Autowired
	private transient ICrud crudImpl;
	
	/**
	 * El finder impl.
	 * @uml.property  name="finderImpl"
	 * @uml.associationEnd  readOnly="true"
	 */
	@Autowired
	private transient IFinder finderImpl;
	
	/** La Constante LOG. */
	private static final Logger LOG = LoggerFactory.getLogger(TrabajosServicioImpl.class);
	
	/**
	 * Nueva instancia de trabajos servicio impl.
	 */
	public TrabajosServicioImpl() {
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#guardarNodos(co.edu.udistrital.erpgrid.bd.modelo.pojo.GridNodo)
	 */
	public GridNodo guardarNodos(GridNodo gridNodo) throws CrudException {
		GridNodo retorno = (GridNodo) crudImpl.save(gridNodo);
		return retorno;
	}

	
	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#eliminarNodos(int)
	 */
	public void eliminarNodos(int id) throws CrudException {
		crudImpl.delete(GridNodo.class, id);

	}

	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#consultarEstados()
	 */
	public List<Estado> consultarEstados() throws FinderException {
		return finderImpl.findAll(Estado.class);
	}

	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#consultarNodos(co.edu.udistrital.erpgrid.bd.modelo.pojo.GridNodo)
	 */
	public GridNodo consultarNodo(GridNodo gridNodo)
			throws FinderException, CrudException {
		
		Criterion id = null;
		if(gridNodo.getId()!=null){
			id = Restrictions.idEq(gridNodo.getId());
		}
		Criterion estado = null;
		if(gridNodo.getEstado()!=null){
			estado = Restrictions.eq("estado", gridNodo.getEstado());
		}
		Criterion ip = null;
		if(gridNodo.getIp()!=null){
			ip = Restrictions.like("ip",gridNodo.getIp());
		}
		Criterion jar = null;
		if(gridNodo.getJar()!=null){
			jar = Restrictions.eq("jar",gridNodo.getJar());
		}
		Criterion indice = null;
		if(gridNodo.getIndice()!=null){
			indice = Restrictions.eq("indice",gridNodo.getIndice());
		}
		
		List<GridNodo> listaNodos = finderImpl.findByCriteria(GridNodo.class, id,estado,ip,jar,indice);
		
		
		if(listaNodos!=null && listaNodos.size()>0){
			gridNodo = listaNodos.get(0);
			int indiceInt = gridNodo.getIndice().intValue()+1;
			gridNodo.setIndice(indiceInt);
			guardarNodos(gridNodo);
		}
		
		return gridNodo;
	}

	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#consultarTodosNodos()
	 */
	public List<GridNodo> consultarTodosNodos() throws FinderException {
		return finderImpl.findAll(GridNodo.class);
	}
	
	/* (non-Javadoc)
	 * @see co.edu.udistrital.erpgrid.trabajos.servicio.api.ITrabajosServicio#consultarIndice()
	 */
	public int consultarIndice(){
		int indice = 0;
		try {
			List resultados = finderImpl.findByNativeQuery("select min(grid.indice) from grid_nodos grid, estados where grid.estado=estados.id_estado and estados.nombre='Activo'");
			if(resultados!=null && resultados.size()>0 && resultados.get(0)!=null){
				indice = Integer.valueOf(String.valueOf(resultados.get(0)));
			}
			else{
				//cuando todos estan inactivos consultar el menor indice y establecerlo
				resultados = finderImpl.findByNativeQuery("select min(grid.indice) from grid_nodos grid");
			}
			if(resultados!=null && resultados.size()>0  && resultados.get(0)!=null){
				indice = Integer.valueOf(String.valueOf(resultados.get(0)));
			}
		} catch (FinderException e) {
			LOG.error(e.getMessage(),e);
		}
		return indice;
	}

}
